/*
 * Copyright(C) 2017 Hangzhou Differsoft Co., Ltd. All rights reserved.
 */
package com.atmilan.quartz.utils.jackyun;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.SimplePropertyPreFilter;

/**
 * json对象转换
 *
 * @author 夏艳秋
 * @since 2017年12月5日 上午11:43:11
 */
public class JsonUtils {
    // region json序列化特性配置

    /**
     * json序列化特性配置。
     */
    private static final SerializerFeature[] SERIALIZER_FEATURES = new SerializerFeature[]{
            // boolean为null时输出false.
            SerializerFeature.WriteNullBooleanAsFalse,
            // 输出空置的字段.
            SerializerFeature.WriteMapNullValue,
            // 如果key不为String 则转换为String，比如Map的key为Integer
            SerializerFeature.WriteNonStringKeyAsString,
            // list为null时输出[]
            SerializerFeature.WriteNullListAsEmpty,
            // number为null时输出0
            // SerializerFeature.WriteNullNumberAsZero,
            // String为null时输出"".
            SerializerFeature.WriteNullStringAsEmpty,
            // 使用枚举的重载方法toString输出值
            SerializerFeature.WriteEnumUsingToString};

    // endregion

    // region 对象转换为json

    /**
     * 对象转换为json
     *
     * @param obj 对象
     * @return json字符串
     */
    public static String toJson(Object obj) {
        if (obj == null) {
            return "";
        }

        if (obj instanceof String) {
            return obj.toString();
        }

        // 过滤掉所有注解。
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        filter.getExcludes().add("metas");

        return JSON.toJSONString(obj, new SerializeConfig(), filter, SERIALIZER_FEATURES);
    }

    // endregion

    // region json转换为对象

    /**
     * json转换为对象(使用了重试机制)
     *
     * @param json                       json
     * @param cls                        转换的类
     * @return 对象
     */
    public static <T> T deJson(String json, Class<T> cls) {
        if (null == json || json.isEmpty()) {
            return null;
        }

        return JSON.parseObject(json, cls);
    }

    /**
     * json转换为对象(使用了重试机制)
     *
     * @param json json
     * @param type  转换的类
     * @return 对象
     */
    public static <T> T deJson(String json, TypeReference<T> type) {
        if (null == json || json.isEmpty()) {
            return null;
        }

        return JSON.parseObject(json, type);
    }

    // endregion
}
